package com.dc.java8._1_lambda.checkexception;

import cn.hutool.core.io.resource.ClassPathResource;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

/**
 * Description: Lambda 操作中针对 方法的受检查异常优化
 * @author: gdc
 * @date: 2021/6/4
 * @version 1.0
 */
@Slf4j
public class LambdaCheckDemo {

    public static void main(String[] args){
        try {
            // 获取项目的根路径
            String path = new ClassPathResource("").getFile().getAbsolutePath();
            log.info("查询文件的路径：{}", path);
            long count = Files.walk(Paths.get(path))                    // 获取项目目录下的 所有文件
                    .filter(file -> !Files.isDirectory(file))           // 筛选出文件
                    .filter(file -> file.toString().endsWith(".yml"))   // 筛选出 yml 文件

//                    .flatMap(Attempt.apply(file -> Files.lines(file)))                        // <<<<<<<<<<<<<<<<<<<<< 此处解决 Lambda 受检查的异常问题

                    .flatMap(Attempt.apply(file -> Files.lines(file), ex -> Stream.empty()))    // <<<<<<<<<<<<<<<<<<<<< 此处解决 Lambda 受检查的异常问题(推荐使用此方法)

                    .filter(line -> !line.trim().isEmpty())             // 过滤掉空行的信息
                    .count();                                           // 行数求和
            log.info("获取的总条数为： {}", count);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /*public static void main(String[] args){
        try {
            // 获取项目的根路径
            String path = new ClassPathResource("").getFile().getAbsolutePath();
            log.info("查询文件的路径：{}", path);
            long count = Files.walk(Paths.get(path))                    // 获取项目目录下的 所有文件
                    .filter(file -> !Files.isDirectory(file))           // 筛选出文件
                    .filter(file -> file.toString().endsWith(".yml"))   // 筛选出 yml 文件

                    .flatMap(file -> {
                        try {
                            // 按行获取文件的内容
                            // 此方法会抛出异常，当前Demo 就是为了解决 Lambda 中抛出异常的问题
                            return Files.lines(file);
                        } catch (IOException e) {
                            e.printStackTrace();
                            return Stream.empty();
                        }
                    })

                    .filter(line -> !line.trim().isEmpty())             // 过滤掉空行的信息
                    .count();                                           // 行数求和
            log.info("获取的总条数为： {}", count);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }*/
}
